package winOrDie.GameEngine.RT.plyrs;

import java.io.IOException;
import java.net.DatagramPacket;


import org.eclipse.swt.graphics.Rectangle;

import winOrDie.GameEngine.RT.mp.MapBoard;

//+:public -:private #:protected $:static F:final
public class Hoggle {
	private final int WIDTH = 18;
	private final int HEIGHT = 18;
	private int speed = MapBoard.getCuadro(); //speed son los pixels por movimiento
	private int suavidad = 2; //suavidad son los pixeles de desplazamiento
	private int score = 0;
	private int vision;
	private Rectangle bounds = null;
	private Rectangle bounds_old = null; //posicion anterior para la doncella
	
	private boolean doncellaRescatada = false; //de inicio, lo usa el heroe para saber si ha rescatado la doncella
	
	private int[] bloqueMov = new int[5];
	
	private final int mirando_abajo = 0;
	private final int mirando_izquierda1 = 1;
	private final int mirando_izquierda2 = 11;
	private final int mirando_arriba = 2;
	private final int mirando_derecha1 = 3;
	private final int mirando_derecha2 = 33;
	private int mirando = mirando_abajo; //default
	
	/**
	 * indica que la doncella ha sido sacada de la caseta central
	 */
	public void setDoncellaRescatada(){
		doncellaRescatada = true;
//		this.rol = 2;
	}
	
	/**
	 * indica que la doncella no ha sido sacada de la caseta central
	 */
	public void setDoncellaNoRescatada(){
		doncellaRescatada = false;
//		this.rol = 2;
	}
	
	/**
	 * 
	 * @return cierto si ha sacado a la doncella de la caseta central
	 */
	public boolean getDoncellaRescatada(){
		return doncellaRescatada;
	}
	
	public int getMirando() {
		return mirando;
	}

	public void setMirando(int mirando) {
		this.mirando = mirando;
	}

	/**
	 * indica si mira hacia arriba
	 * @return cierto si ya miraba arriba
	 */
	public boolean mira_arriba(){
		return (mirando == mirando_arriba);
	}
	
	/**
	 * indica si mira hacia abajo
	 * @return cierto si ya miraba abajo
	 */
	public boolean mira_abajo(){	
		return (mirando == mirando_abajo);
	}
	
	/**
	 * indica si mira hacia izquierda
	 * @return 0 -> no mira, 1 y 2 si mira (paso 1 o paso 2)
	 */
	public int mira_izquierda(){
		if (mirando == mirando_izquierda1) return 1;
		
		if (mirando == mirando_izquierda2) return 2;
		return 0;
	}
	
	/**
	 * indica si mira hacia derecha
	 * @return 0 -> no mira, 1 y 2 si mira (paso 1 o paso 2)
	 */
	public int mira_derecha(){
		if (mirando == mirando_derecha1) return 1;
		
		if (mirando == mirando_derecha2) return 2;
		return 0;
	}

	/**
	 * vista del jugador en casillas a su alrededor
	 * @return
	 */
	public int getVision() {
		return vision;
	}

	/**
	 *  indica el rol del personaje
	 *  1 -> Hoggle
	 *  2 -> Doncella
	 *  3 -> Pirata
	 */
	private int rol;

	/**
	 * Devuelve el rol del personaje
	 * @return
	 *  1 -> Hoggle
	 *  2 -> Doncella
	 *  3 -> Pirata
	 */
	public int getRol() {
		return rol;
	}

	/**
	 * Indica el rol del personaje
	 * @param rol
	 *  1 -> Hoggle
	 *  2 -> Doncella
	 *  3 -> Pirata
	 */
	public void setRol(int rol) {
		this.rol = rol;
	}
	
	/**
	 * cierto si es el heroe
	 * @return
	 */
	public boolean isHero(){
		return (getRol() == 1);
	}
	
	/**
	 * cierto si es la doncella
	 * @return
	 */
	public boolean isDoncella(){
		return (getRol() == 2);
	}
	
	/**
	 * cierto si es un pirata
	 * @return
	 */
	public boolean isPirate(){
		return (getRol() == 3);
	}
	
	public int getSpeed() {
		return speed;
	}

	/**
	 * @param x
	 * @param y
	 * @param cuadro
	 * @param rolPlayer
	 *  1 -> Hoggle
	 *  2 -> Doncella
	 *  3 -> Pirata
	 *  @param vista vista del jugador en casillas a su alrededor
	 */
	public Hoggle(int x, int y, int cuadro, int rolPlayer, int vista) {
		bounds = new Rectangle(x + (cuadro - WIDTH)/2, y + (cuadro - HEIGHT)/2, WIDTH, HEIGHT);
		bounds_old = new Rectangle(x + (cuadro - WIDTH)/2, y + (cuadro - HEIGHT)/2, WIDTH, HEIGHT);
		rol = rolPlayer;
		this.vision = vista;
	}

	public int getWidth() {
		return WIDTH;
	}

	public int getHeight() {
		return HEIGHT;
	}

	public void setBoundsX(int x) {
		this.bounds.x = x;
	}
	
	public void setBoundsY(int y) {
		this.bounds.y = y;
	}
	
	public void setBounds_oldX(int x) {
		this.bounds_old.x = x;
	}
	
	public void setBounds_oldY(int y) {
		this.bounds_old.y = y;
	}

	public int[] moveUP() {
		//bounds.y--;
//		mirando = mirando_arriba;
//		bounds_old.y = bounds.y;
//		bounds_old.x = bounds.x;
//		
//		bounds.y -= speed;
		bloqueMov[2] = bounds.x;
		bloqueMov[3] = bounds.y;
		bloqueMov[0] = bounds.x;
		bloqueMov[1] = bounds.y - speed;
		bloqueMov[4] = mirando_arriba;
		
//		System.out.println("moveUP:  X: " + bloqueMov[0]
//              	+ " Y: " + bloqueMov[1] + " X_D: " + bloqueMov[2]
//		        + " Y_D: " + bloqueMov[3] + " Mirando: " + bloqueMov[4]);
		
		return bloqueMov;
	}

	public int[] moveDOWN() {
		//bounds.y++;
//		mirando = mirando_abajo;
//		bounds_old.y = bounds.y;
//		bounds_old.x = bounds.x;
//		
//		bounds.y += speed;
		bloqueMov[2] = bounds.x;
		bloqueMov[3] = bounds.y;
		bloqueMov[0] = bounds.x;
		bloqueMov[1] = bounds.y + speed;
		bloqueMov[4] = mirando_abajo;
		
//		System.out.println("moveDOWN:  X: " + bloqueMov[0]
//             	+ " Y: " + bloqueMov[1] + " X_D: " + bloqueMov[2]
//		        + " Y_D: " + bloqueMov[3] + " Mirando: " + bloqueMov[4]);
		
		return bloqueMov;
	}
	
	public int[] moveRIGTH() {
//		thread_runMoveRight.start();
		
//		if (mirando == mirando_derecha1) mirando = mirando_derecha2;
//		else mirando = mirando_derecha1;
//		
////		for (int i = 0; i < speed/suavidad; i++) {
////			bounds.x += suavidad;
////		
////		}
//		bounds_old.y = bounds.y;
//		bounds_old.x = bounds.x;
//		bounds.x += speed;
		bloqueMov[2] = bounds.x;
		bloqueMov[3] = bounds.y;
		bloqueMov[0] = bounds.x + speed;
		bloqueMov[1] = bounds.y;
		
		if (mirando == mirando_derecha1) bloqueMov[4] = mirando_derecha2;
		else bloqueMov[4] = mirando_derecha1;
		
//		System.out.println("moveRIGHT:  X: " + bloqueMov[0]
//				+ " Y: " + bloqueMov[1] + " X_D: " + bloqueMov[2]
//				+ " Y_D: " + bloqueMov[3] + " Mirando: " + bloqueMov[4]);
		
		return bloqueMov;
	}
	
	public int[] moveLEFT() {
		
//		if (mirando == mirando_izquierda1) mirando = mirando_izquierda2;
//		else mirando = mirando_izquierda1;
//		
//		bounds_old.y = bounds.y;
//		bounds_old.x = bounds.x;
//		bounds.x -= speed;
		bloqueMov[2] = bounds.x;
		bloqueMov[3] = bounds.y;
		bloqueMov[0] = bounds.x - speed;
		bloqueMov[1] = bounds.y;
		
		if (mirando == mirando_izquierda1) bloqueMov[4] = mirando_izquierda2;
		else bloqueMov[4] = mirando_izquierda1;
		
//		System.out.println("moveLEFT:  X: " + bloqueMov[0]
//                  	+ " Y: " + bloqueMov[1] + " X_D: " + bloqueMov[2]
//		            + " Y_D: " + bloqueMov[3] + " Mirando: " + bloqueMov[4]);
		
		return bloqueMov;
	}

	public void incScore() {
		score++;
	}

	public int getScore() {
		return score;
	}

	public Rectangle getBound() {
		return bounds;
	}
	
	public Rectangle getBound_doncella() {
		return bounds_old;
	}
}
